package pre.vo;

/**
 * 페이징 처리를 위한 빈 객체
 * page : 게시물의 집합
 * page group : page의 집합
 * 
 * @author hyem55
 * @since 2013.07.23
 */
public class pageVO {
	// 글 목록에서 한페이지에 보여질 게시물 수
	public static final int CONTENT_PER_PAGE = 5;
	// 한 페이지 그룹으로 묶을 페이지의 개수
	public static final int PAGE_PER_PAGEGROUP = 5;
	
	private int totContent; //총 데이터(게시물)의 개수
	private int currPage; //현재페이지
	private int contentsPerPage = CONTENT_PER_PAGE; //한 페이지에 보여질 데이터(게시물)의 개수
	private int pagePerPageGroup = PAGE_PER_PAGEGROUP; //페이지 그룹에 들어갈 페이지 개수
	
	/** 총 데이터(게시물)의 개수, 현재페이지를 받아 member variable에 할당*/
	public pageVO(int totContent, int currPage) {
		super();
		this.totContent = totContent;
		this.currPage = currPage;
	}
	/** 현재페이지에 대한 setter/getter 메소드*/
	public int getCurrPage() {
		return currPage;
	}

	public void setCurrPage(int currPage) {
		this.currPage = currPage;
	}
	/** 한 페이지에 보여질 데이터 수 getter 메소드*/
	public int getContentsPerPage() {
		return contentsPerPage;
	}

	/**
	 * 총 페이지 수를 return한다.<br>
	 * 1. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 => 0 이면 둘을 /  값이 총 페이지 수<br>
	 * 2. 전체 데이터(게시물) % 한 페이지에 보여줄 데이터 개수 => 0보다 크면 둘을 /  값에 +1을 한 값이 총 페이지 수
	 */
	public int getTotalPage(){
		int totalPage = 0; //총 페이지 수 초기화
		if(totContent % contentsPerPage == 0){
			totalPage = totContent/contentsPerPage;
		}else{
			totalPage = (totContent/contentsPerPage) + 1;
		}
		return totalPage;
	}
	/**
	 * 총 페이지 그룹의 수를 return한다.<br>
	 * 1. 총 페이지수 %  Page Group 내 Page 수.  => 0 이면 둘을 /  값이 총 페이지 수<br>
	 * 2. 총 페이지수 %  Page Group 내 Page 수.  => 0보다 크면 둘을 /  값에 +1을 한 값이 총 페이지 수
	 */	
	public int getTotalPageGroup(){
		int totalPageGroup = 0; //총 페이지 그룹 수 초기화
		
		if(totContent % pagePerPageGroup == 0){
			totalPageGroup = getTotalPage()/pagePerPageGroup;
		}else{
			totalPageGroup = (getTotalPage()/pagePerPageGroup)+1;
		}
		return totalPageGroup;
	}
	/**(수정요망)
	 * 현재 페이지가 속한 페이지 그룹 번호(몇 번째 페이지 그룹인지)을 리턴하는 메소드
     * 1. 현재 페이지 %  Page Group 내 Page 수 => 0 이면 둘을 / 값이 현재 페이지 그룹. 
	 * 2. 현재 페이지 %  Page Group 내 Page 수 => 0 크면 둘을 /  값에 +1을 한 값이 현재 페이지 그룹
	 */
	public int getCurrentPageGroup(){
		int currentPageGroup = 0;
		if(getCurrPage() % pagePerPageGroup ==0){
			currentPageGroup = getCurrPage() / pagePerPageGroup;
		}else{
			currentPageGroup = (getCurrPage()/pagePerPageGroup)+1;
		}
		return currentPageGroup;
	}
	/**(수정요망)
	 * 현재 페이지가 속한 페이지 그룹의 시작 페이지 번호를 return 한다.<br>
	 * 1. Page Group 내 Page 수*(현재 페이지 그룹 -1) + 1을 한 값이 첫 페이지이다.(페이지 그룹*페이지 그룹 개수 이 그 그룹의 마지막 번호이므로)
	 * 2. 위의 계산 결과가 0인 경우는 첫페이지 이므로 1을 return 한다. 
	 */
	public int getStartPageOfPageGroup(){
		int startPageNo = 0;
		startPageNo = pagePerPageGroup * (getCurrentPageGroup()-1)+1;
		if(startPageNo ==0){
			startPageNo = 1;
		}
		return startPageNo;
	}
	/**
	 * 현재 페이지가 속한 페이지 그룹의 마지막 페이지 번호를 return 한다.<br>
	 * 1. 현재 페이지 그룹 * 페이지 그룹내 페이지 수 가 마지막 번호이다.
	 * 2. 그 그룹의 마지막 페이지 번호가 전체 페이지의 마지막 페이지 번호보다 큰 경우는 전체 페이지의 마지막 번호를 return 한다. 
	 */
	public int getEndPageOfPageGroup(){
		int endPageNo = 0;
		endPageNo = getCurrentPageGroup() * pagePerPageGroup;
		
		if(endPageNo > getTotalPage()){
			endPageNo = getTotalPage();
		}
		return endPageNo;
	}
	/**
	 * 이전 페이지 그룹이 있는지 체크
	 * 현재 페이지가 속한 페이지 그룹이 1보다 크면 true
	 */
	public boolean isPreviousPageGroup(){		
		boolean flag = false;
		 	
		if(getCurrentPageGroup() > 1){
			flag = true;
		}
		
		return flag;
	}	
	/**
	 * 다음 페이지 그룹이 있는지 체크
	 * 현재 페이지 그룹이 마지막 페이지 그룹(마지막 페이지 그룹 == 총 페이지 그룹 수) 보다 작으면 true
	 */
	public boolean isNextPageGroup(){		
		boolean flag = false;
		
		if(getCurrentPageGroup() < getTotalPageGroup()){
			flag = true;
		}
		 		
		return flag;
	}	
}
